logo


Introduction

Ce document Rmarkdown (R + Markdown) propose une approche des solutions open source pour la gestion et l’analyse des données tracéologiques et des données liées à l’iconographie ancienne. Le document alterne modèles 3D, cartes, liens, tableaux, etc. avec des “morceaux de code” informatique (i.e. code chunks, en fond grisé). Les données sources sont enregistrées dans deux repository GitHub: zoometh/3DHOP qui est un fork de 3DHOP (3D Heritage Online Presenter), et où sont entreposés les données 3D, et zoometh/rockart pour le reste des données.

Tracéologie

travail en cours de réalisation avec l'IMF-CSIC (Barcelone, Espagne)

La tracéologie (use-wear analysis) est l’étude de traces souvent microscopiques sur des objets ayant des dimensions allant de quelques centimètres à plusieurs mètres. Une intégration 3D de ces différentes échelles peut permettre une meilleure compréhension des savoirs-faires (technologie, archéologie du geste, etc.) et une meilleure diffusion de ces connaissances dans la communauté scientifique et auprès du grand public via le web 3D.

Sur chaque acquisition 3D, le dessin d’une zone d’intérêt permet de localiser les traces d’utilisation et de lier ce modèle 3D avec un autre modèle 3D obtenu à une échelle inférieure. Dans cet exemple, nous travaillons à l’intégration de modèles 3D issus de trois échelles différentes (M, m, \(\mu\)).

Zones d’intérêt

Le dessin des zone d’intérêt (Region of Interest, ou ROI) est une surface 3D dessinée directement sur l’objet depuis un logiciel d’édition 3D (e.g. Blender).

Dessin de la ROI (en vert) comme surface 3D sur le modèle 3D (en gris) dans le logiciel Blender

L’objet (échelle supérieure) et la surface 3D (échelle inférieure) sont enregistrés au format .ply. L’objet est transformé en .nxz, un format adapté pour le streaming 3D, avec l’application Nexus. Ces modèles, sont ensuite intégrés dans le framework 3DHOP et stockés dans le fork du dépôt GitHub zoometh/3DHOP.

Schéma de travail (workflow) pour l’exposition d’un modèle 3D sur le web

Ci-dessous nous présentons une capture d’écran d’un modèle 3D d’un outil expérimental avec la ROI (à gauche en bleu, peu visible) localisant (grossièrement) les traces d’utilisation. Cette ROI est activable ou desactivable avec le boution 3DHOP . Quand la ROI est clickée, elle peut ouvrir une nouvelle page HTML avec le modèle 3D à l’échelle inférieure

Modèle 3D intégré dans le framework 3DHOP

Ce modèle peut être consulté à cette URL:

https://zoometh.github.io/3DHOP/minimal/lithic_tool.html

Echelles

Approche 3D multi-scalaire
echelle mesures instrument
macro cm Laser
meso mm HIROX
micro \(\mu\)m ConFocal

Macro (M)

Acquisition de l’objet avec un laser, ou en photogrammétrie

Acquisition avec le Laser de lumière structurée smart SCAN 3D Breuckman (IMF-CSIC)

meso (m)

Acquisition avec le HIROX (IMF-CSIC)

Micro (\(\mu\))

Acquisiion avec le ConFocal (IMF-CSIC). Le ConFocal est une solution de microscopie optique 3D qui réalise des piles d’images de très faibles profondeur de champ (~ 400 nm) appelées ‘sections optiques’

Iconographie ancienne

Nous présentons ci-dessous, un essai de FAIRisation des données 3D liées aux graphies anciennes (art rupestre, hiéroglyphes). Ici, nous prenons ces deux (2) sites en exemple:

 

Pour chacun de ces sites, le logo signale l’existence d’un modèle 3D

Mont Bego

La région du mont Bégo (Alpes-Maritimes, France) est surtout connue pour son art rupestre avec un nombre impressionnant de roches gravées, mais le site est aussi l’un des premiers de montagne à être occupé au début du Néolithique (ca. -5300 BC)

Données

Actuellement, les données sont stockées dans une base de données Postgres 13 locale. Ici, nous sélectionnons quelques champs - y compris les coordonnées géographiques - et les exportons dans un fichier .csv stocké dans le dépôt GitHub.

drv <- dbDriver("PostgreSQL")
con <- dbConnect(RPostgres::Postgres(),
                 dbname = "bego_20_04_2021",
                 host="localhost",
                 port=5433,
                 user="postgres",
                 password="postgres")  
sqll <- "SELECT idroche, nom, x, y, z FROM roches_spat"
roches.all <- dbGetQuery(con,sqll)
roches.all$idroche <- gsub("\\.", "\\_", roches.all$idroche )
write.csv(roches.all, "data/roches_all.csv", row.names = F)
dbDisconnect(con)

Certaines roches gravées ont été modélisées en 3D par photogrammétrie (logiciel commercial Metashape Photoscan) au format 3D (.obj ou .ply). Une application commerciale comme Sketchfab permet de mettre un modèle 3D en ligne et d’intégrer un conteneur <iframe> vers ce modèle. Comme ici:

Dans le domaine du libre, ces modèles une fois transformés sont manipulés avec le framework 3DHOP et stockés dans le fork du dépôt GitHub zoometh/3DHOP. Dans le code chunk ci-dessous, nous lisons le contenu du dossier ‘minimal’ pour obtenir les noms de ces modèles (stockés en tant que fichiers .nxz dans le dossier ‘models’).

roches.all <- read.csv("data/roches_all.csv")
req <- GET(url.html)
stop_for_status(req)
filelist <- unlist(lapply(content(req)$tree, "[", "path"), use.names = F)
D3.models <- grep("minimal/.*html$", filelist, value = TRUE)
D3.models <- gsub("minimal/", "", D3.models)
D3.models <- sort(gsub(".html$", "", D3.models))
nm.models <- roches.all[roches.all$idroche %in% D3.models, "nom"]
l.nm.models <- paste0(paste0("*", nm.models, "* (", D3.models,")"))
nb.models <- length(D3.models)

Actuellement, il existe 7 modèles 3D: Looped Skin Rock (), Roche de l’archer (), Roche de l’anthropomorphe aux bras en zigzag (4_3_16D), Stèle du Chef de Tribu (7_1_8), Roche du Sorcier (8_2_34), Looped Skin Rock (KIU2610), Roche de l’archer (lithic_tool)

Cartographie

Nous lions les URL des roches gravées modélisées en 3D par jointure sur leur identifiant (e.g., 7_1_8) dans la table des roches – pour les ouvrir directement à partir de la carte Leaflet –, et nous attribuons à ces roches une icône personnalisée (icône ‘3DHOP’)

roches.3D <- roches.all[roches.all$idroche %in% D3.models, ]
roches.others <- roches.all[!(roches.all$idroche %in% D3.models), ]
roches.3D.icons <- icons(
  iconUrl = url.icon,
  iconWidth = 40, iconHeight = 56,
  iconAnchorX = 20, iconAnchorY = 28
)
roches.3D$desc <- paste0("roche: ", roches.3D$idroche, '<br> 3D model: <a href=',
                         shQuote(paste0(url.3dhop, roches.3D$idroche, ".html")),
                         "\ target=\"_blank\"",">", roches.3D$nom, "</a>")
roches.others$desc <- paste0("roche: ", roches.others$idroche)
leaflet(width = "700px", height = "700px") %>%
  addTiles(group = 'OSM') %>%
  addProviderTiles("Esri.WorldImagery", group = "Ortho") %>%
  addCircleMarkers(data = roches.others,
                   lng = ~x,
                   lat = ~y,
                   popup = ~desc,
                   color = "red",
                   radius = 0.5,
                   opacity = 0.8) %>%
  addMarkers(data = roches.3D,
             lng = ~x,
             lat = ~y,
             popup = ~desc,
             icon = roches.3D.icons) %>%
  addLayersControl(
    baseGroups = c('Ortho', 'OSM')) %>%
  addScaleBar(position = "bottomleft")

 

Certains de ces modèles 3D ont des annotations, comme la Roche de l’homme aux bras en zigzag, ou la Stèle du Chef de Tribu

Karnak

En Haute-Egypte, le complexe cultuel de Karnak (temples, pylos, chapelles, etc.) se développe au cours du Nouvel Empire, corrélativement au culte d’Amon. Le site est étudié depuis près de 150 ans par une équipe d’égyptologues français. La documentation de ces monuments en 3D, et l’interopérabilité de ces modèles 3D, peut permettre de mieux comprendre l’évolution des hiéroglyphes dans le temps (paléographie)

Données

Le jeu de données correspond à un fichier .csv (locus.csv) conservé sur GitHub

locus <- read.csv("www/locus.csv", sep = ";", row.names = NULL)
kable(locus, "html", escape = FALSE,
      caption = "Données Karnak") %>%
  kable_styling(bootstrap_options = c("hover", "condensed"), font_size=12)
Données Karnak
KIU nom couleur D3 X Y credit3D
1027 Chapelle de Sésostris Ier white NA 32.65720 25.72034
1192 Chapelle d’Hatshepsut red NA 32.65768 25.72043
2610 Chapelle de Philippe Arrhidée green KIU2610 32.65867 25.71810 SirCharlesWilson - Sketchfab

Les liens entre ces données et leurs identifiants KIU (Karnak Identifiant Unique) – qui sont égalment des URL– sont générés par concatenation

url.sith <- "http://sith.huma-num.fr/karnak/"
locus$url <- paste0('<a href=', shQuote(paste0(url.sith, locus$KIU)),
                    "\ target=\"_blank\"",">", paste0("KIU",locus$KIU), "</a>")

Le (très beau) modèle 3D de KIU2610, nous est fourni par Sketchfab

Ce modèle est ouvert dans Blender et une nouvelle géométrie (un mesh) sur une partie de sa surface pour signaler un panneau (KIU2613). Ce panneau est donc un sous-ensemble de KIU2160

Cartographie

Ces données sont comparées avec les modèles 3D existant dans le repository GitHub zoometh/3DHOP

req <- GET(url.html)
stop_for_status(req)
filelist <- unlist(lapply(content(req)$tree, "[", "path"), use.names = F)
D3.models <- grep("minimal/.*html$", filelist, value = TRUE)
D3.models <- gsub("minimal/", "", D3.models)
D3.models <- sort(gsub(".html$", "", D3.models))
nm.models <- locus[locus$url %in% D3.models, "D3"]
nb.models <- length(nrow(nm.models))

monum.3D <- locus[locus$D3 %in% D3.models, ]
monum.others <- locus[!(locus$D3 %in% D3.models), ]
monum.3D.icons <- icons(
  iconUrl = url.icon,
  iconWidth = 40, iconHeight = 56,
  iconAnchorX = 0, iconAnchorY = 0
)
monum.3D$desc <- paste0(monum.3D$url, " : ", monum.3D$nom, '<br><a href=',
                        shQuote(paste0(url.3dhop, monum.3D$D3, ".html")),
                        "\ target=\"_blank\"",">","<b> modèle 3D </b>", "</a>")
monum.others$desc <- paste0(monum.others$url, " : ", monum.others$nom)
leaflet(width = "700px", height = "700px") %>%
  addTiles(group = 'OSM') %>%
  addProviderTiles("Esri.WorldImagery", group = "Ortho") %>%
  addCircleMarkers(data = monum.others,
                   lng = ~X,
                   lat = ~Y,
                   popup = ~desc,
                   color = ~couleur,
                   radius = 15,
                   opacity = .5) %>%
  addMarkers(data = monum.3D,
             lng = ~X,
             lat = ~Y,
             popup = ~desc,
             icon = monum.3D.icons) %>%
  addLayersControl(
    baseGroups = c('Ortho', 'OSM')) %>%
  addScaleBar(position = "bottomleft")